package com.boot.proofing.mpweb.business.entity.fs;/**
 * @description
 * @autor xbwu on 2018/7/9.
 */

import com.boot.proofing.common.db.CustomerMetaObjectHandler;
import com.boot.proofing.mpweb.business.entity.Menu;
import com.boot.proofing.mpweb.business.service.IMenuService;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 字段策略
 * 用于给特殊字段在插入或更新的时候有不同的写入判断，因为默认mybatis plus的字段更新策略是为字段为null时字段不会更新
 * 可以在字段上通过注解 @TableField(strategy=?) 来调整这个逻辑。
 * @author xbwu
 * @create 2018-07-09 
 **/
@Component(MenuFieldStrategy.BEAN_NAME)
public class MenuFieldStrategy implements CustomerMetaObjectHandler{

    public static final String BEAN_NAME="menuFieldStrategy";
    @Autowired
    private IMenuService menuService;

    @Override
    public void insertFill(MetaObject metaObject) {
        //获得父节点
        String parentNode=(String) getFieldValByName("parentNode",metaObject);
        if(StringUtils.isBlank(parentNode)){
            return;
        }
        Menu parentMenu=menuService.getById(parentNode);
        Integer level=(Integer) getFieldValByName("level",metaObject);
        if(level==null){
            setFieldValByName("level", parentMenu.getLevel()+1,metaObject);
        }
        String fullParentNode=(String) getFieldValByName("fullParentNode",metaObject);
        if(fullParentNode==null){
            setFieldValByName("fullParentNode", parentMenu.getFullParentNode()+parentNode,metaObject);
        }
        Boolean spread=(Boolean) getFieldValByName("spread",metaObject);
        if(spread==null){
            setFieldValByName("spread", false,metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //获得父节点
        String parentNode=(String) getFieldValByName("parentNode",metaObject);
        if(StringUtils.isBlank(parentNode)){
            return;
        }
        Menu parentMenu=menuService.getById(parentNode);
        Integer level=(Integer) getFieldValByName("level",metaObject);
        if(level==null){
            setFieldValByName("level", parentMenu.getLevel()+1,metaObject);
        }
        String fullParentNode=(String) getFieldValByName("fullParentNode",metaObject);
        if(fullParentNode==null){
            setFieldValByName("fullParentNode", parentMenu.getFullParentNode()+parentNode,metaObject);
        }
    }
}
